from django.http import JsonResponse
from django.shortcuts import render

# Create your views here.


"""
需求分析：根据页面的功能（从上到下，从左到右），哪些功能需要和后端配合使用
如何确定哪些功能需要和后端进行交互呢？？？
        1.经验
        2.关注类似网址的相似功能
"""

"""
判断用户名是否重复的功能
前端： 当用户输入用户名之后，失去焦点，发送一个axios(ajax)请求

后端：
    请求：接收用户名
    业务逻辑：根据用户名查询数据库，如果查询结果数量等于0，说明没有注册，
            如果查询结果数量等于1，说明有注册
    响应： JSON
          {code:0,count:0/1,errmsg:ok
    路由： GET usernames/<username>/count/
    路由：
        1.接收数据
        2.根据用户名查询数据库
        3.
"""

from django.views import View
from .models import User
class UsernameCountView(View):
    def get(self,request,username):
        # 1.接收用户
        # 2.根据用户名查询数据
        count=User.objects.filter(username=username).count()
        # 3.返回响应
        return JsonResponse({'code':0,'count':count,'errmsg':'ok'})
    pass

############注册###############
import json
import re
class RegisterView(View):
    def post(self,request):
        # 1.接收请求（POST-----JSON）
        #获取原始请求体（bytes类型(二进制数据)）
        #请求体是原始的 JSON 字符串，必须通过request.body获取
        body_bytes = request.body
        #将转换为字符串(str类型)
        body_str=body_bytes.decode()
        #将JSON字符串解析为Python字典
        body_dict=json.loads(body_str)

        # 2.获取数据
        username=body_dict.get('username')
        password=body_dict.get('password')
        password2=body_dict.get('password2')
        mobile=body_dict.get('mobile')
        allow=body_dict.get('allow')# 协议同意状态（布尔值）

        # 3.验证数据
        #   3.1 确保用户名、密码、确认密码、手机号、是否同意协议都填写了,不为空
        #all([xxx,xxx,xxx])
        #all里的元素只要有一个为None/False，返回False;否则返回True
        if not all([username,password,password2,mobile,allow]):
            return JsonResponse({'code':400,'errmsg':'参数不全'})
        #   3.2 用户名满足规则，用户名不重复
        if not re.match(r'^(?=.*[a-zA-Z_-])[a-zA-Z0-9_-]{5,20}$',username):
            return JsonResponse({'code':400,'errmsg':'请输入5-20个字符的用户名且不能为纯数字'})

        #   3.3 密码满足规则
        if not re.match(r'.{8,20}',password):
            return JsonResponse({'code':400,'errmsg':'密码长度必须为8-20位'})

        #   3.4 确认密码和密码一致
        if password2!=password:
            return JsonResponse({'code':400,'errmsg':'两次输入的密码不一致'})

        #   3.5 手机号满足规则，手机号不能重复
        if not re.match(r'^1[345789]\d{9}$',mobile):#\d 是正则表达式中的元字符，专门匹配任意一个数字字符（0-9），等价于 [0-9]。
            return JsonResponse({'code':400,'errmsg':'您输入的手机号格式不正确'})

        #   3.6 需要同意协议
        if not allow:
            return JsonResponse({'code':400,'errmsg':'请同意用户协议'})

        # 4.数据入库(方法一和方法二保存的数据密码不加密)
        # 方法一:
        # user=User(username=username,password=password,mobile=mobile)
        # user.save()
        # 方法二:
        # User.objec ts.create(username=username,password=password,mobile=mobile)
        # 方法三(密码加密):
        user=User.objects.create_user(username=username,password=password,mobile=mobile)

        # 系统（Django）为我们提供了状态保持的方法
        from django.contrib.auth import login
        # 状态保持--登录用户的状态保持
        # user 已经登录的用户信息
        login(request,user)

        # 5.返回响应
        return JsonResponse({'code':0,'errmsg':'ok'})
"""
如果需求是注册成功后即表示用户认证通过，那么此时可以在注册成功后实现状态保持(注册成功即已经登录)      
如果需求是注册成功后不表示用户认证通过，那么此时不用在注册成功后实现状态保持(注册成功，单独登录)     
实现状态保持的方式主要有：
    在客户端存储信息使用Cookie 
    在服务器端存储信息使用Sessio
    Token
"""